package text00.tx05;

import java.lang.reflect.Method;

/**
 * 主人 - 可以带“任意”宠物去逛街
 *
 * 注意：
 *  在泛型中，extends 关键字用于设置泛型的边界（指定类型的范围）
 *  如果不设置边界，默认为 Object
 *
 *  语法一：<T extends 接口>
 *     T 为指定接口
 *     T 为指定接口的子接口
 *     T 为指定接口的实现类
 *
 *  语法二：<T extends 类>
 *      T 为指定类
 *      T 为指定类的子类
 *
 *  思考：为什么要设置边界呢？
 *  让泛型不那么含糊，设置一个上限的接口或类，从而可以调用其方法
 *
 *
 * @author V
 * @date 2025-03-26
 */
public class People<P extends IWenShun & ICall> {
    /**
     * 宠物 -
     */
    private P pet;

    public P getPet() {
        return pet;
    }

    public void setPet(P pet) {
        this.pet = pet;
    }

    /**
     * 逛街
     */
    public void shopping() {
        System.out.println("逛街...");
        // 注意：在编译时，无法确定 P 具体是谁，因此无法调用 call方法 - 默认是 Object
        // 解决一：强转
        // 解决二：设置边界
        // 解决三：反射
        Class<?> clazz = pet.getClass();

        try {
            // 实例化 pet
            Method method = clazz.getDeclaredMethod("call");
            if(method!=null) {
                method.invoke(pet);
            }
        } catch (NoSuchMethodException e) {
            System.out.println("卖萌一下！");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
